(function($){
    
    var methods = {
        init : function( opcoes ) { 
            var config = {
                click : false
            }

            $.extend(config, opcoes);

            this.each(function(){
                var div_pai = $(this);

                // Criando os elementos
                var div_conteudo = $('<div id="'+div_pai.attr("id")+'_conteudo"></div>');
                var div_rodape = $('<div id="'+div_pai.attr("id")+'_rodape"></div>');
                var form_parametros = $('<form id="'+div_pai.attr("id")+'_parametros"></form>');
                var form_rows = $('<select name="rows">'+
                        '<option value="50" >50</option>'+
                        '<option value="100" >100</option>'+
                        '<option value="200" >200</option>'+
                    '</select>');
                var form_button_primeiro = $('<input type="button" value="&lt;&lt;"/>');
                var form_button_anterior = $('<input type="button" value="&lt;"/>');
                var form_page = $('<input type="text" size="2" value="1" name="page"/>');
                var form_page_final = $('<span id="page_final">0</span>');
                var form_button_proximo = $('<input type="button" value="&gt;"/>');
                var form_button_ultimo = $('<input type="button" value="&gt;&gt;"/>');
                var form_itens = $('<span id="itens"> | Exibindo item(ns) 0 a 0 de 0</span>');
                
                var processa_resultado = function processa_resultado(response){
                    var rows = eval(myPaginator.form_rows.val());
                    var total = eval(response["total"]);

                    myPaginator.item1 = (myPaginator.page-1)*rows +1;
                    myPaginator.item2 = (myPaginator.page * rows) < total ? (myPaginator.page * rows) : total;
                    myPaginator.page_final = (total/rows) % 2 == 0 || (total/rows) == 1 ? (total/rows) : parseInt(total/rows) +1 ;
                    form_page.attr("value", myPaginator.page);
                    form_page_final.html(myPaginator.page_final);

                    form_itens.html(" | Exibindo item(ns) "+myPaginator.item1+" a "+myPaginator.item2+" de "+total);

                    if(myPaginator.page == 1){
                        form_button_primeiro.prop("disabled", true);
                        form_button_anterior.prop("disabled", true);
                    }else{
                        form_button_primeiro.prop("disabled", false);
                        form_button_anterior.prop("disabled", false);
                    }

                    if(myPaginator.page == myPaginator.page_final){
                        form_button_proximo.prop("disabled", true);
                        form_button_ultimo.prop("disabled", true);
                    }else{
                        form_button_proximo.prop("disabled", false);
                        form_button_ultimo.prop("disabled", false);
                    }

                    if(response["total"] == 0){
                        div_conteudo.html("<span style='display: block; text-align: center; font-size: 12px; padding-top: 10px; padding-bottom: 10px; font-weight: bold; color: #006600; border-bottom: 1px solid #999999; margin-bottom: 2px;'>Nenhum resultado encontrado</span>");
                        form_itens.html(" | Exibindo item(ns) 0 a 0 de 0");
                        form_button_primeiro.prop("disabled", true);
                        form_button_anterior.prop("disabled", true);
                        form_button_proximo.prop("disabled", true);
                        form_button_ultimo.prop("disabled", true);
                        return false;
                    }

                    var dados = response["rows"];
//                    var conteudo = "";
                    div_conteudo.html("");
                    myPaginator.dados_response = dados;
                    myPaginator.rows_selecionadas = [];
                    
                    for(var i=0; i < dados.length; i++){
                        //Crio o dive do conteudo
                        var linha = $("<div id='row-"+i+"'></div>");
                        
                        // verifico se o paginador e clicavel
                        if (myPaginator.config.click){
                            // Se clicavel adiciono o evento
                            linha.bind("click", {row_index: i} ,function(event){
                                config.click(event.data.row_index, myPaginator.dados_response[event.data.row_index]);
                            });
                            linha.css("cursor", "pointer");
                        }
                        linha.append(config.conteudo(i, dados[i]));
                        div_conteudo.append(linha);
                    }
//                    div_conteudo.html(conteudo);
                }

                var myPaginator = {
                    config: config,
                    page: 1,
                    page_final: 1,
                    item1: 0,
                    item2: 0,
                    div_rodape: div_rodape,
                    div_conteudo: div_conteudo,
                    form_rows: form_rows,
                    form_button_primeiro: form_button_primeiro,
                    form_button_anterior: form_button_anterior,
                    form_page: form_page,
                    form_page_final: form_page_final,
                    form_button_proximo: form_button_proximo,
                    form_button_ultimo: form_button_ultimo,
                    form_itens: form_itens,
                    processa_resultado: processa_resultado,
                    dados_form: $(config.formulario).serialize(),
                    dados_response: new Array(),
                    rows_selecionadas : new Array()
                }
                
                div_pai.data("myPaginator", myPaginator);


                // configurando os elementos
                form_parametros.submit(function(evento){
                    evento.preventDefault();
                    methods.consultar.call(div_pai, myPaginator.form_page.val());
                });
                form_button_primeiro.click(function(){
                    methods.consultar.call(div_pai, 1);
                });
                form_button_proximo.click(function(){
                    methods.consultar.call(div_pai, myPaginator.page + 1);
                });
                form_button_anterior.click(function(){
                    methods.consultar.call(div_pai, myPaginator.page - 1);
                });
                form_button_ultimo.click(function(){
                    methods.consultar.call(div_pai, myPaginator.page_final);
                });
                form_rows.change(function(){
                    methods.consultar.call(div_pai, 1);
                });


                // Juntando os elementos
        //        div_pai.append(div_cabecalho);
                div_pai.append(div_conteudo);
                div_pai.append(div_rodape);
                div_rodape.append(form_parametros);
                form_parametros.append(form_rows);
                form_parametros.append("&nbsp;");
                form_parametros.append(form_button_primeiro);
                form_parametros.append("&nbsp;");
                form_parametros.append(form_button_anterior);
                form_parametros.append("&nbsp;Pagina&nbsp;");
                form_parametros.append(form_page);
                form_parametros.append("&nbsp;de&nbsp");
                form_parametros.append(form_page_final);
                form_parametros.append("&nbsp;");
                form_parametros.append(form_button_proximo);
                form_parametros.append("&nbsp;");
                form_parametros.append(form_button_ultimo);
                form_parametros.append(form_itens);
                
                methods.consultar.call(this, 1);

                
            });
        },
        consultar : function(page_to_go) {
            var div_pai = $(this);
            var myPaginator = div_pai.data("myPaginator");
            
            var rows = myPaginator.form_rows.val();
            
            // Valida o valor de page
            if (!isNaN(page_to_go)){
                if ((page_to_go > myPaginator.page_final && myPaginator.page_final > 0) || page_to_go < 1){
                    alert("Página inexistente!");
                    myPaginator.form_page.attr("value", myPaginator.page);
                    return false;
                }
            }
            else{
                alert("O valor digitado deve ser numérico!");
                myPaginator.form_page.attr("value", myPaginator.page);
                return false;
            }

            myPaginator.page = eval(page_to_go);
            myPaginator.div_conteudo.html("<span style='display: block; text-align: center; font-size: 12px; padding-top: 10px; padding-bottom: 10px; font-weight: bold; color: #006600; border-bottom: 1px solid #999999; margin-bottom: 2px;'>Aguarde...</span>");
            $.ajax({
              type: 'POST',
              url: myPaginator.config.url,
              data: {
                page: page_to_go,
                rows: rows,
                consulta: myPaginator.dados_form
                },
              success: function(response){myPaginator.processa_resultado(response);},
//              error: function(response){alert("Erro: ");},
              dataType: "json"
//                    success: function(response){ $("#erro").html(response)},
//                    dataType: "html"
            });

                    return false;
        },
        reload : function( opcoes ) {
            var div_pai = $(this);
            var myPaginator = div_pai.data("myPaginator");
            if (myPaginator){
                var config = myPaginator.config;
                $.extend(config, opcoes);
                myPaginator.dados_form = $(config.formulario).serialize();
                methods.consultar.call(this, myPaginator.page);
            }else{
                $.error("Object myPaginator does not exist");
            }
        },
        update : function( opcoes ) {
            var div_pai = $(this);
            var myPaginator = div_pai.data("myPaginator");
            if (myPaginator){
                var config = myPaginator.config;
                $.extend(config, opcoes);
                myPaginator.dados_form = $(config.formulario).serialize();
                methods.consultar.call(this, 1);
            }else{
                $.error("Object myPaginator does not exist");
            }
        }
    };

    $.fn.myPaginator = function( method ) {
    
        // Method calling logic
        if ( methods[method] ) {
          return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
          return methods.init.apply( this, arguments );
        } else {
          $.error( 'Method ' +  method + ' does not exist on jQuery.myPaginator' );
        }
  
    };

})(jQuery);